package cn.silver.module.system.service.impl;

import cn.silver.framework.mybatis.service.impl.BaseServiceImpl;
import cn.silver.module.system.bean.DeptUserBean;
import cn.silver.module.system.domain.SysDeptUser;
import cn.silver.module.system.mapper.SysDeptUserMapper;
import cn.silver.module.system.param.DeptUserParam;
import cn.silver.module.system.service.ISysDeptUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class SysDeptUserServiceImpl extends BaseServiceImpl<SysDeptUserMapper, SysDeptUser, DeptUserParam, DeptUserBean>
        implements ISysDeptUserService {

//    private final SystemServiceFactory factory;
//
//    @Override
//    public ResultPage<SysDeptUser> selectPage(PageDomain domain, SysDeptUser entity) {
//        QueryWrapper<SysDeptUser> queryWrapper = this.buildQueryWrapper(entity);
//        StringBuilder sql = new StringBuilder("select 1 from sys_user su where su.id = sys_dept_user.user_id ");
//        if (StringUtils.isNotBlank(entity.getUserName())) {
//            sql.append("and su.name like '%").append(entity.getUserName()).append("%' ");
//        }
//        if (StringUtils.isNotBlank(entity.getUserCode())) {
//            sql.append("and su.username like '%").append(entity.getUserCode()).append("%' ");
//        }
//        if (StringUtils.isNotBlank(entity.getMobile())) {
//            sql.append("and su.mobile like '%" + entity.getMobile() + "%' ");
//        }
//        if (StringUtils.isNotBlank(entity.getEmail())) {
//            sql.append("and su.email like '%" + entity.getEmail() + "%' ");
//        }
//        if (StringUtils.isNotBlank(entity.getWorkNo())) {
//            sql.append("and su.work_no like '%" + entity.getWorkNo() + "%' ");
//        }
//        queryWrapper.exists(sql.toString());
//        Page<SysDeptUser> page = baseMapper.selectPage(this.build(domain), queryWrapper);
//        if (page.getTotal() > 0) {
//            List<SysUser> users = this.factory.getUserService().selectByIds(page.getRecords().stream().filter(item -> StringUtils.isNotBlank(item.getUserId()))
//                    .map(SysDeptUser::getUserId).collect(Collectors.toList()));
//            Map<String, UserModel> userMap = users.stream().collect(Collectors.toMap(SysUser::getId, SysUser::convertModel));
//            page.getRecords().stream().forEach(item -> item.setUser(userMap.get(item.getUserId())));
//        }
//        return new ResultPage<>(page.getRecords(), page.getTotal());
//    }
//
//    @Override
//    public List<SysDeptUser> selectDeadlineUser(int amount) {
//        List<SysDeptUser> result = this.baseMapper.selectList(new QueryWrapper<SysDeptUser>()
//                .eq("user_type", UserPostTypeConstant.SECOND_POST.getCode()).isNotNull("stop_time")
//                .eq("stop_time", DateUtils.truncate(DateUtils.addDays(new Date(), amount), Calendar.DATE)));
//        if (CollectionUtils.isNotEmpty(result)) {
//            Set<String> userIds = result.stream().map(SysDeptUser::getUserId).collect(Collectors.toSet());
//            List<SysUser> users = this.factory.getUserService().selectByIds(userIds);
//            Map<String, UserModel> userMap = users.stream().collect(Collectors.toMap(SysUser::getId, SysUser::convertModel));
//            result.stream().forEach(item -> item.setUser(userMap.get(item.getUserId())));
//        }
//        return result;
//    }
//
//    @Override
//    public List<UserModel> selectManager(String companyId, String userType) {
//        if (StringUtils.isNotBlank(companyId)) {
//            List<SysDeptUser> deptUsers = this.baseMapper.selectList(new LambdaQueryWrapper<SysDeptUser>().eq(SysDeptUser::getDeptId, companyId)
//                    .eq(SysDeptUser::getUserType, userType));
//            if (CollectionUtils.isNotEmpty(deptUsers)) {
//                List<SysUser> users = this.factory.getUserService().selectByIds(deptUsers.stream().map(SysDeptUser::getUserId).collect(Collectors.toSet()));
//                return users.stream().map(SysUser::convertModel).collect(Collectors.toList());
//            }
//        }
//        return Collections.emptyList();
//    }
//
//    @Override
//    public Set<String> selectManageDepts(String userId) {
//        List<SysDeptUser> deptUsers = this.baseMapper.selectList(new LambdaQueryWrapper<SysDeptUser>().eq(SysDeptUser::getUserId, userId)
//                .in(SysDeptUser::getUserType, UserPostTypeConstant.MANAGER_POST.getCode(), UserPostTypeConstant.HR_POST.getCode()));
//        if (CollectionUtils.isNotEmpty(deptUsers)) {
//            return deptUsers.stream().map(SysDeptUser::getDeptId).collect(Collectors.toSet());
//        } else {
//            return Collections.singleton("");
//        }
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
//    public void saveDeptUser(String deptId, String userId, String userType, String remark) {
//        SysDeptUser entity = this.selectOne(new QueryWrapper<SysDeptUser>().eq("dept_id", deptId).eq("user_id", userId)
//                .eq("user_type", userType).ne("status", UserPostStatusConstant.CLOSE.getCode()));
//        if (entity != null) {
//            throw new ServiceException("您在当前单位的借调还未结束，请结束后再申请，如果需要延长借调时间，请发起延期申请", ResponseEnum.DATA_ERROR_EXIST.getCode());
//        }
//        entity = new SysDeptUser(deptId, userId, userType);
//        entity.setRemark(remark);
//        entity.setStatus(UserPostStatusConstant.APPLY.getCode());
//        this.baseMapper.insert(entity);
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
//    public void approveDeptUser(SelfBill bill, JSONObject model) {
//        SysDeptUser entity;
//        if (StringUtils.isNotBlank(bill.getDeptId())) {
//            entity = this.selectOne(new QueryWrapper<SysDeptUser>().eq("dept_id", bill.getDeptId()).eq("user_id", bill.getUserId())
//                    .eq("user_type", UserPostTypeConstant.SECOND_POST.getCode()).ne("status", UserPostStatusConstant.CLOSE.getCode()));
//            if (entity != null) {
//                entity.setStartTime(model.getDate("startTime"));
//                entity.setStopTime(model.getDate("stopTime"));
//                entity.setStatus(UserPostStatusConstant.SECOND.getCode());
//                this.baseMapper.updateById(entity);
//            } else {
//                entity = new SysDeptUser(bill.getDeptId(), bill.getUserId(), UserPostTypeConstant.SECOND_POST.getCode());
//                entity.setStartTime(model.getDate("startTime"));
//                entity.setStopTime(model.getDate("stopTime"));
//                entity.setStatus(UserPostStatusConstant.SECOND.getCode());
//                this.baseMapper.insert(entity);
//            }
//        } else {
//            entity = new SysDeptUser(model.getStr("deptId"), bill.getUserId(), UserPostTypeConstant.SECOND_POST.getCode());
//            entity.setStartTime(model.getDate("startTime"));
//            entity.setStopTime(model.getDate("stopTime"));
//            entity.setStatus(UserPostStatusConstant.SECOND.getCode());
//            this.baseMapper.insert(entity);
//        }
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
//    public int insert(SysDeptUser entity) {
//        this.checkAllowed(entity);
//        List<String> userIds = this.executeRole(entity);
//        entity.setStartTime(DateUtils.truncate(new Date(), Calendar.DATE));
//        List<SysDeptUser> exists = this.baseMapper.selectList(new LambdaQueryWrapper<SysDeptUser>().eq(SysDeptUser::getDeptId, entity.getDeptId())
//                .in(SysDeptUser::getUserId, userIds).ne(SysDeptUser::getStatus, UserPostStatusConstant.CLOSE.getCode()));
//        userIds.removeAll(exists.stream().map(SysDeptUser::getUserId).collect(Collectors.toSet()));
//        AtomicInteger flag = new AtomicInteger();
//        if (CollectionUtils.isNotEmpty(userIds)) {
//            userIds.stream().forEach(cur -> {
//                SysDeptUser item = new SysDeptUser(entity, cur);
//                item.preInsert();
//                flag.addAndGet(this.baseMapper.insert(item));
//            });
//        }
//        return flag.get();
//    }
//
//    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
//    public void checkAllowed(SysDeptUser entity) {
//        SysDept dept = StringUtils.isNotBlank(entity.getDeptId()) ? factory.getDeptService().selectById(entity.getDeptId()) : null;
//        if (dept == null) {
//            throw new ServiceException("管理组织不存在", ResponseEnum.DATA_ERROR_NOT_FOUND.getCode());
//        }
//    }
//
//    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
//    public List<String> executeRole(SysDeptUser entity) {
//        List<String> userIds = new ArrayList<>();
//        userIds.add(entity.getUserId());
//        userIds.addAll(entity.getUserIds());
//        userIds = userIds.stream().filter(StringUtils::isNotBlank).distinct().collect(Collectors.toList());
//        if (CollectionUtils.isNotEmpty(userIds) && UserPostTypeConstant.getManagers().contains(entity.getUserType())) {
//            this.baseMapper.update(new LambdaUpdateWrapper<SysDeptUser>().set(SysDeptUser::getUserType, entity.getUserType())
//                    .eq(SysDeptUser::getDeptId, entity.getDeptId()).in(SysDeptUser::getUserId, userIds).ne(SysDeptUser::getStatus, UserPostStatusConstant.CLOSE.getCode()));
//            List<SysRole> roles = this.factory.getRoleService().list(new QueryWrapper<SysRole>()
//                    .eq(UserPostTypeConstant.MANAGER_POST.getCode().equalsIgnoreCase(entity.getUserType()), "type", RoleTypeConstant.COMPANY_ADMIN_ROLE.getCode())
//                    .eq(UserPostTypeConstant.HR_POST.getCode().equalsIgnoreCase(entity.getUserType()), "type", RoleTypeConstant.COMPANY_HR_ROLE.getCode())
//                    .in("bus_key", entity.getDeptId(), "common"));
//            List<String> finalUserIds = userIds;
//            roles.stream().forEach(role -> this.factory.getUserRoleService().insert(new SysUserRole(role.getId(), finalUserIds)));
//        }
//        return userIds;
//    }
}
